<?php

namespace app\common\enum;

/**
 * 可自定义标签的枚举Trait
 * 支持静态访问枚举值和标签
 */
trait EnumTrait
{
    /**
     * 获取枚举的自定义标签文本
     * 
     * @return string
     */
    public function label(): string
    {
        // 从注解中获取自定义标签
        $reflection = new \ReflectionClassConstant(static::class, $this->name);
        $attributes = $reflection->getAttributes();
        
        foreach ($attributes as $attribute) {
            // 支持任何包含标签文本的注解
            $args = $attribute->getArguments();
            if (!empty($args) && is_string($args[0])) {
                return $args[0];
            }
        }

        // 无注解时，回退到枚举名转换
        $name = $this->name;
        $words = explode('_', $name);
        $words = array_map('ucfirst', array_map('strtolower', $words));
        return implode(' ', $words);
    }

    /**
     * 通过静态访问返回枚举值
     * 
     * @param string $name 枚举名称
     * @param array $arguments 参数（兼容方法调用）
     * @return mixed 枚举值
     */
    public static function __callStatic(string $name, array $arguments)
    {
        // 查找匹配的枚举实例
        foreach (self::cases() as $case) {
            if ($case->name === $name) {
                return $case->value;
            }
        }
        
        throw new \BadMethodCallException("枚举值 {$name} 不存在");
    }

    /**
     * 通过枚举值获取枚举名称
     * 
     * @param mixed $value 枚举值
     * @return string|null 枚举名称或null
     */
    public static function getNameByValue($value): ?string
    {
        foreach (self::cases() as $case) {
            if ($case->value === $value) {
                return $case->name;
            }
        }
        return null;
    }

    /**
     * 通过枚举名称获取枚举值
     * 
     * @param string $name 枚举名称
     * @return mixed|null 枚举值或null
     */
    public static function getValueByName(string $name): ?string
    {
        foreach (self::cases() as $case) {
            if ($case->name === $name) {
                return $case->value;
            }
        }
        return null;
    }

    /**
     * 生成下拉选项数组
     * 
     * @return array
     */
    public static function toSelect(): array
    {
        $options = [];
        foreach (self::cases() as $case) {
            $options[] = [
                'value' => $case->value,
                'label' => $case->label(),
                'name' => $case->name
            ];
        }
        return $options;
    }
}